// 只会输出一轮
// for (var i = 0; i < 3; i++) {
//     for (var i = 0; i < 3; i++) {
//         console.log(i);
//     }
//     console.log("内层结束i=" + i);
// }
// 0
// 1
// 2
// 内层结束i=3

// 使用let之后 会输出三轮,并且外部的i那里会输出 0 1 2
// for (let i = 0; i < 3; i++) {
//     for (let i = 0; i < 3; i++) {
//         console.log(i);
//     }
//     console.log("内层结束外部的i=" + i);
// }

// ------------------------------------------

var elements = [{}, {}, {}];
// for (var i = 0; i < elements.length; i++) {
//     elements[i].onclick = function () {
//         console.log(i);
//     };
// }
// // 这里不管调用第几个元素的点击事件输出的i都是3
// elements[1].onclick(); //

// 如果想拿到每个元素对应的点击事件,以前我们建立一个闭包就可以解决这个问题
// for (var i = 0; i < elements.length; i++) {
//     elements[i].onclick = (function (i) {
//         return function () {
//             console.log(i);
//         };
//     })(i);
// }
// elements[1].onclick();

// 使用了let之后,让i只在块级作用域内生效
// for (let i = 0; i < elements.length; i++) {
//     elements[i].onclick = function () {
//         console.log(i);
//     };
// }
// elements[1].onclick();

// 再来一个例子就更理解let了
// for (let i = 0; i < 3; i++) {
//     let i = "foo";
//     // 这里会输出3个foo
//     console.log(i);
// }

let i = 0;
if (i < 3) {
    let i = "foo";
    console.log(i);
}
i++;
if (i < 3) {
    let i = "foo";
    console.log(i);
}
i++;
if (i < 3) {
    let i = "foo";
    console.log(i);
}

// 循环体中的i是内层独立的作用域
// 外层是for循环本身的作用域
// let的声明不会出现提升

// 用var不会报错
console.log(foo); // undefined
var foo = "es6";

// let就会报错
// console.log(foo);
// let foo = "es6";

const obj = {};
obj.name = "jack";
console.log(obj);


